// TODO: 别忘加更改环境变量的 VITE_UPLOAD_BASEURL 地址。
const VITE_UPLOAD_BASEURL = import.meta.env.VITE_UPLOAD_BASEURL

/**
 * useUpload 是一个定制化的请求钩子，用于处理上传图片。
 * @param formData 额外传递给后台的数据，如{name: '菲鸽'}。
 * @returns 返回一个对象{loading, error, data, run}，包含请求的加载状态、错误信息、响应数据和手动触发请求的函数。
 */
export default function useUpload<T = string>(formData: Record<string, any> = {}) {
    const loading = ref(false)
    const error = ref(false)
    const data = ref<T>()
    const run = () => {
        // #ifdef MP-WEIXIN
        // 微信小程序从基础库 2.21.0 开始， wx.chooseImage 停止维护，请使用 uni.chooseMedia 代替。
        // 微信小程序在2023年10月17日之后，使用本API需要配置隐私协议
        uni.chooseMedia({
            count: 1,
            mediaType: ['image'],
            success: (res) => {
                loading.value = true
                const tempFilePath = res.tempFiles[0].tempFilePath
                uploadFile<T>({ tempFilePath, formData, data, error, loading })
            },
            fail: (err) => {
                console.error('uni.chooseMedia err->', err)
                error.value = true
            },
        })
        // #endif
        // #ifndef MP-WEIXIN
        uni.chooseImage({
            count: 1,
            success: (res) => {
                loading.value = true
                const tempFilePath = res.tempFilePaths[0]
                uploadFile<T>({ tempFilePath, formData, data, error, loading })
            },
            fail: (err) => {
                console.error('uni.chooseImage err->', err)
                error.value = true
            },
        })
        // #endif
    }

    return { loading, error, data, run }
}

function uploadFile<T>({ tempFilePath, formData, data, error, loading }) {
    uni.uploadFile({
        url: VITE_UPLOAD_BASEURL,
        filePath: tempFilePath,
        name: 'file',
        formData,
        success: (uploadFileRes) => {
            data.value = uploadFileRes.data as T
        },
        fail: (err) => {
            console.error('uni.uploadFile err->', err)
            error.value = true
        },
        complete: () => {
            loading.value = false
        },
    })
}
